using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._DataComparison
{
    /// <summary>
    /// <para>Raster Compare</para>
    /// <para>Compares the properties of two raster or mosaic datasets.</para>
    /// <para>比较两个栅格数据集或镶嵌数据集的属性。</para>
    /// </summary>    
    [DisplayName("Raster Compare")]
    public class RasterCompare : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public RasterCompare()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_base_raster">
        /// <para>Input Base Raster</para>
        /// <para>The first raster or mosaic dataset to compare.</para>
        /// <para>要比较的第一个栅格或镶嵌数据集。</para>
        /// </param>
        /// <param name="_in_test_raster">
        /// <para>Input Test Raster</para>
        /// <para>The second raster or mosaic dataset to compare with the first.</para>
        /// <para>要与第一个栅格或镶嵌数据集进行比较的第二个栅格或镶嵌数据集。</para>
        /// </param>
        public RasterCompare(object _in_base_raster, object _in_test_raster)
        {
            this._in_base_raster = _in_base_raster;
            this._in_test_raster = _in_test_raster;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Raster Compare";

        public override string CallName => "management.RasterCompare";

        public override List<string> AcceptEnvironments => ["scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_base_raster, _in_test_raster, _compare_type.GetGPValue(), _ignore_option, _continue_compare.GetGPValue(), _out_compare_file, _parameter_tolerances, _attribute_tolerances, _omit_field, _compare_status.GetGPValue()];

        /// <summary>
        /// <para>Input Base Raster</para>
        /// <para>The first raster or mosaic dataset to compare.</para>
        /// <para>要比较的第一个栅格或镶嵌数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Base Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_base_raster { get; set; }


        /// <summary>
        /// <para>Input Test Raster</para>
        /// <para>The second raster or mosaic dataset to compare with the first.</para>
        /// <para>要与第一个栅格或镶嵌数据集进行比较的第二个栅格或镶嵌数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Test Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_test_raster { get; set; }


        /// <summary>
        /// <para>Compare Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of rasters that will be compared.</para>
        ///   <bulletList>
        ///     <bullet_item>Raster dataset—Two raster datasets will be compared.</bullet_item><para/>
        ///     <bullet_item>Geodatabase raster dataset—Two raster datasets in a geodatabase will be compared.</bullet_item><para/>
        ///     <bullet_item>Mosaic dataset—Two mosaic datasets will be compared.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要比较的栅格类型。</para>
        ///   <bulletList>
        ///     <bullet_item>栅格数据集—将比较两个栅格数据集。</bullet_item><para/>
        ///     <bullet_item>地理数据库栅格数据集 - 将比较地理数据库中的两个栅格数据集。</bullet_item><para/>
        ///     <bullet_item>镶嵌数据集—将比较两个镶嵌数据集。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Compare Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _compare_type_value _compare_type { get; set; } = _compare_type_value._RASTER_DATASET;

        public enum _compare_type_value
        {
            /// <summary>
            /// <para>Raster dataset</para>
            /// <para>Raster dataset—Two raster datasets will be compared.</para>
            /// <para>栅格数据集—将比较两个栅格数据集。</para>
            /// </summary>
            [Description("Raster dataset")]
            [GPEnumValue("RASTER_DATASET")]
            _RASTER_DATASET,

            /// <summary>
            /// <para>Geodatabase raster dataset</para>
            /// <para>Geodatabase raster dataset—Two raster datasets in a geodatabase will be compared.</para>
            /// <para>地理数据库栅格数据集 - 将比较地理数据库中的两个栅格数据集。</para>
            /// </summary>
            [Description("Geodatabase raster dataset")]
            [GPEnumValue("GDB_RASTER_DATASET")]
            _GDB_RASTER_DATASET,

            /// <summary>
            /// <para>Mosaic dataset</para>
            /// <para>Mosaic dataset—Two mosaic datasets will be compared.</para>
            /// <para>镶嵌数据集—将比较两个镶嵌数据集。</para>
            /// </summary>
            [Description("Mosaic dataset")]
            [GPEnumValue("MOSAIC_DATASET")]
            _MOSAIC_DATASET,

        }

        /// <summary>
        /// <para>Ignore Options</para>
        /// <para><xdoc>
        ///   <para>Specifies the properties that will be ignored in the comparison.</para>
        ///   <bulletList>
        ///     <bullet_item>Band count—The number of bands will be ignored.</bullet_item><para/>
        ///     <bullet_item>Extent—The extent will be ignored.</bullet_item><para/>
        ///     <bullet_item>Columns and rows—The number of columns and rows will be ignored.</bullet_item><para/>
        ///     <bullet_item>Pixel type—The pixel type will be ignored.</bullet_item><para/>
        ///     <bullet_item>NoData—The NoData value will be ignored.</bullet_item><para/>
        ///     <bullet_item>Spatial reference—The spatial reference system will be ignored.</bullet_item><para/>
        ///     <bullet_item>Pixel value—The pixel values will be ignored.</bullet_item><para/>
        ///     <bullet_item>Colormap—Existing color maps will be ignored.</bullet_item><para/>
        ///     <bullet_item>Raster attribute table—Existing attribute tables will be ignored.</bullet_item><para/>
        ///     <bullet_item>Statistics—Statistics will be ignored.</bullet_item><para/>
        ///     <bullet_item>Metadata—Metadata will be ignored.</bullet_item><para/>
        ///     <bullet_item>Pyramids exist—Existing pyramids will be ignored.</bullet_item><para/>
        ///     <bullet_item>Compression type—The compression type will be ignored.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定在比较中将忽略的属性。</para>
        ///   <bulletList>
        ///     <bullet_item>波段计数 - 波段数将被忽略。</bullet_item><para/>
        ///     <bullet_item>范围—将忽略范围。</bullet_item><para/>
        ///     <bullet_item>列和行 - 将忽略列数和行数。</bullet_item><para/>
        ///     <bullet_item>像素类型—像素类型将被忽略。</bullet_item><para/>
        ///     <bullet_item>NoData - 将忽略 NoData 值。</bullet_item><para/>
        ///     <bullet_item>空间参考—将忽略空间参考系。</bullet_item><para/>
        ///     <bullet_item>像素值—像素值将被忽略。</bullet_item><para/>
        ///     <bullet_item>颜色映射表—将忽略现有颜色映射表。</bullet_item><para/>
        ///     <bullet_item>栅格属性表 - 现有属性表将被忽略。</bullet_item><para/>
        ///     <bullet_item>统计数据—统计数据将被忽略。</bullet_item><para/>
        ///     <bullet_item>元数据 - 元数据将被忽略。</bullet_item><para/>
        ///     <bullet_item>存在金字塔 - 现有金字塔将被忽略。</bullet_item><para/>
        ///     <bullet_item>压缩类型 - 将忽略压缩类型。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Ignore Options")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _ignore_option { get; set; } = null;


        /// <summary>
        /// <para>Continue Comparison</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the comparison will stop if a mismatch is encountered.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—The comparison will stop if a mismatch is encountered. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—The comparison will continue if a mismatch is encountered.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定在遇到不匹配时是否停止比较。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 如果遇到不匹配，比较将停止。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中—如果遇到不匹配，比较将继续。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Continue Comparison")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _continue_compare_value _continue_compare { get; set; } = _continue_compare_value._false;

        public enum _continue_compare_value
        {
            /// <summary>
            /// <para>CONTINUE_COMPARE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("CONTINUE_COMPARE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_CONTINUE_COMPARE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_CONTINUE_COMPARE")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Output Compare File</para>
        /// <para>A text file containing the comparison results.</para>
        /// <para>包含比较结果的文本文件。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Compare File")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_compare_file { get; set; } = null;


        /// <summary>
        /// <para>Parameter Tolerance</para>
        /// <para><xdoc>
        ///   <para>The tolerances that determine the range in which values are considered equal. The same tolerance can be applied to all parameters, or different tolerances can be applied to individual parameters.</para>
        ///   <para>The tolerance type can be set as either a value or a fraction. For example, if the base value is 100 and a fraction tolerance is set to 0.00001, the compare tolerance will be within 100 * 0.001 (100 * 0.00001).</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>确定将值视为相等的范围的公差。相同的公差可以应用于所有参数，也可以将不同的公差应用于单个参数。</para>
        ///   <para>公差类型可以设置为值或分数。例如，如果基值为 100，并且分数容差设置为 0.00001，则比较容差将在 100 * 0.001 （100 * 0.00001） 范围内。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Parameter Tolerance")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _parameter_tolerances { get; set; } = null;


        /// <summary>
        /// <para>Attribute Tolerance</para>
        /// <para>The fields that will be compared to determine if they are within a tolerance. The tolerance value is a value in the units of the attribute.</para>
        /// <para>将进行比较以确定它们是否在公差范围内的字段。公差值是以属性为单位的值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Attribute Tolerance")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _attribute_tolerances { get; set; } = null;


        /// <summary>
        /// <para>Omit Fields</para>
        /// <para>The field or fields that will be omitted during comparison.</para>
        /// <para>在比较过程中将省略的一个或多个字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Omit Fields")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _omit_field { get; set; } = null;


        /// <summary>
        /// <para>Compare Status</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Compare Status")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public _compare_status_value _compare_status { get; set; }

        public enum _compare_status_value
        {
            /// <summary>
            /// <para>NO_DIFFERENCES_FOUND</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_DIFFERENCES_FOUND")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>DIFFERENCES_FOUND</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("DIFFERENCES_FOUND")]
            [GPEnumValue("false")]
            _false,

        }

        public RasterCompare SetEnv(object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}